/*
 *  Copyright 2001-2004 The Apache Software Foundation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package ar.uba.fi.posgrado.common.service.impl;

import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import ar.uba.fi.posgrado.common.exception.PosgradoException;
import ar.uba.fi.posgrado.common.service.PosgradoJob;
import ar.uba.fi.posgrado.economy.model.Debt;
import ar.uba.fi.posgrado.economy.service.DebtService;

/**
 * Servicio scheduleado que tiene por fin:
 * <ul>
 * <li><b>1- </b>Verificar la vigencia o no de las deudas para ponerlas en estado vigente</li>
 * <li><b>1.1- </b>Una vez seteada la vigencia o no de las deudas, se modifica el saldo de
 * las cuentas corrientes</li>
 * <li><b>2- </b>Pasar las deudas con saldo o activas (vigentes) a Vencidas.</li>
 * </ul>
 * <br>
 * En caso que la primer accion haya fallado se corta el job y se loggea lo
 * ocurrido.<br>
 * Si por el contrario, se finaliza con exito la primer accion y falla la
 * segunda, entonces no solo se loggea sino que se rollbackea la primer accion y
 * los datos no quedan incoherentes.<br>
 * 
 * @author nicolas.gonzalez
 * @see PosgradoJob
 */
public class DebtActivationJobImpl implements PosgradoJob {

	private static Logger logger = Logger
			.getLogger(DebtActivationJobImpl.class);

	/** Servicio de deudas */
	private DebtService debtService;

	/**
	 * La transaccion implica crear una {@link Propagation#REQUIRES_NEW nueva},
	 * lo q hace que los servicios utilizados reciban esta y no creen nuevos.<br>
	 * En caso q alguno de los servicios falle entonces falla todo en conjunto.<br>
	 * Es necesario, para q todo funcione atomicamente, que los servicios
	 * utilizados tengan la transaccionabilidad
	 * {@link Propagation#MANDATORY mandatory}.
	 * 
	 * @see ar.uba.fi.posgrado.common.service.PosgradoJob#executeJob()
	 */
	@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
	public void executeJob() throws PosgradoException {
		logger.info("Ejecutando el servicio de jobs de activacion/vencimiento de deudas ...");

		try {
			List<Debt> debts = this.debtService.activateDebts();
			logger.info("Cantidad de deudas a ser modificadas/actualizadas: "
					+ debts.size());

			logger.info("Servicio de jobs de activacion de deuda finalizado con exito...");
			logger.info("Comenzando a tratar las deudas a pasar a vencer");
			
			List<Debt> toDeActivateDebs = this.debtService.deActivateDebts();
			logger.info("Cantidad de deudas pasadas a vencidas: "
                    + toDeActivateDebs.size());
			
		} catch (PosgradoException e) {
			logger.error(
					"Excepcion activando/deactivando deudas y estado de cuentas corriente",
					e);
			throw e;
		}
	}

	/**
	 * @param debtService
	 *            the debtService to set
	 */
	public void setDebtService(DebtService debtService) {
		this.debtService = debtService;
	}


}
